package com.suning.sawp.dto.bi;

import java.io.Serializable;
import java.math.BigDecimal;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 销售金额对象
 * 〈一句话功能简述〉<br> 
 * 〈功能详细描述〉
 *
 * @author 15050519
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class BiSaleAmountDto implements Serializable {

    private static final Logger LOGGER = LoggerFactory.getLogger(BiSaleAmountDto.class);
    
    /**
     */
    private static final long serialVersionUID = 4325635047452342802L;
    
    /**
     * 万
     */
    public static final long WAN = 10000l;
    
    /**
     * 亿
     */
    public static final long YI = 100000000l;
    
    /**
     * 除数保留2位小数
     */
    public static final int SCALE_TWO = 2;
    
    /**
     * 单位元
     */
    public static final String UNIT_NORMAL = "元";
    
    /**
     * 单位万元
     */
    public static final String UNIT_WAN = "万元";
    
    /**
     * 单位亿元
     */
    public static final String UNIT_YI = "亿元";

    /**
     * 销售额
     */
    private String amount;
    
    /**
     * 单位类型
     * 1-元, 2-万元, 3-亿元
     */
    private String unit;
    
    /**
     * 根据此字段排序
     */
    private BigDecimal sortMoney;

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getUnit() {
        return unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }
    
    public BigDecimal getSortMoney() {
        return sortMoney;
    }

    public void setSortMoney(BigDecimal sortMoney) {
        this.sortMoney = sortMoney;
    }

    /**
     * 默认构造函数
     */
    public BiSaleAmountDto () {
        
    }
    
    public BiSaleAmountDto (String amount, String unit) {
        this.amount = amount;
        this.unit = unit;
    }
    
    public BiSaleAmountDto(String amount, String unit, BigDecimal sortMoney) {
        this.amount = amount;
        this.unit = unit;
        this.sortMoney = sortMoney;
    }

    /**
     * 计算销售金额
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param saleAmount
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static BiSaleAmountDto valueOf(BigDecimal saleAmount) {
        String amount;
        String unit = UNIT_WAN;
        if (null == saleAmount) {
            amount = "0.00";
        } else if (saleAmount.longValue() < YI){
            // 除以1万,单位显示万元
            amount = saleAmount.divide(BigDecimal.valueOf(WAN), SCALE_TWO, BigDecimal.ROUND_HALF_EVEN).toString();
        } else {
            // 除以1亿,单位显示亿元
            amount = saleAmount.divide(BigDecimal.valueOf(YI), SCALE_TWO, BigDecimal.ROUND_HALF_EVEN).toString();
            unit = UNIT_YI;
        }
        // 返回对象
        return new BiSaleAmountDto(amount, unit, saleAmount);
    }
    
    /**
     * 计算客单价
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param saleAmount
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static BiSaleAmountDto valueOfLow(BigDecimal saleAmount) {
        String amount;
        String unit = UNIT_NORMAL;
        if (null == saleAmount) {
            amount = "0.00";
        } else if (saleAmount.longValue() < WAN){
            amount = saleAmount.setScale(SCALE_TWO, BigDecimal.ROUND_DOWN).toString();
        } else {
            // 除以1万,单位显示万元
            amount = saleAmount.divide(BigDecimal.valueOf(WAN), SCALE_TWO, BigDecimal.ROUND_HALF_EVEN).toString();
            unit = UNIT_WAN;
        }
        // 返回对象
        return new BiSaleAmountDto(amount, unit, saleAmount);
    }
    
    /**
     * 计算价格
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param saleAmount
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static BiSaleAmountDto valueOf(String saleAmount) {
        try {
            return valueOf(new BigDecimal(saleAmount));
        } catch (Exception e) {
            LOGGER.warn("saleAmount is wrong, amount=" + saleAmount, e);
        }
        return zero();
    }
    
    /**
     * 默认0
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static BiSaleAmountDto zero() {
        return new BiSaleAmountDto("0.00", UNIT_WAN);
    }
    
    /**
     * 根据单位转换金额
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param saleAmount
     * @param unit
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static BiSaleAmountDto valueOf(BigDecimal saleAmount, String unit) {
        String amount;
        if (null == saleAmount) {
            amount = "0.00";
        } else {
            if (UNIT_WAN.equals(unit)) {
                amount = saleAmount.divide(BigDecimal.valueOf(WAN), SCALE_TWO, BigDecimal.ROUND_HALF_EVEN).toString();
            } else if (UNIT_YI.equals(unit)) {
                amount = saleAmount.divide(BigDecimal.valueOf(YI), SCALE_TWO, BigDecimal.ROUND_HALF_EVEN).toString();
            } else {
                unit = UNIT_NORMAL;
                amount = saleAmount.setScale(SCALE_TWO, BigDecimal.ROUND_DOWN).toString();
            }
        }
        // 返回对象
        return new BiSaleAmountDto(amount, unit, saleAmount);
    }
    
}
